gusucode.com > VC++ 窗体实现多国家语音切换程序-源码程序 > VC++ 窗体实现多国家语音切换程序-源码程序/code/MultiLanguage.cpp
// MultiLanguage.cpp : Defines the class behaviors for the application. // Download by http://www.NewXing.com #include "stdafx.h" #include "MultiLanguage.h" #include "MultiLanguageDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMultiLanguageApp BEGIN_MESSAGE_MAP(CMultiLanguageApp, CWinApp) //{{AFX_MSG_MAP(CMultiLanguageApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMultiLanguageApp construction CMultiLanguageApp::CMultiLanguageApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CMultiLanguageApp object CMultiLanguageApp theApp; CString g_szLanguagePath; //保存语言文件的路径 CString g_szSettingPath; //保存设置的文件路径 CString g_szCurPath; //保存当前路径 BOOL CMultiLanguageApp::InitInstance() { //获取当前路径 CString szCurPath(""); GetModuleFileName(NULL,szCurPath.GetBuffer(MAX_PATH),MAX_PATH); szCurPath.ReleaseBuffer(); g_szCurPath = szCurPath.Left(szCurPath.ReverseFind('\\') + 1); //设置文件在当前路径下 g_szSettingPath = g_szCurPath + "setting.ini"; CFileFind find; if(!find.FindFile(g_szSettingPath)) MakeResource(IDR_SETTING,g_szSettingPath); find.Close(); //装入语言 LoadLanguage(); CMultiLanguageDlg dlg; m_pMainWnd = &dlg; dlg.DoModal(); return FALSE; } /********************************************************************* * 函数名称:g_LoadString * 说明: 根据标识 szID到选定的语言文件中加载字符串 * 作者: Geng *********************************************************************/ CString g_LoadString(CString szID) { CString szValue; DWORD dwSize = 1000; GetPrivateProfileString("String",szID,"Not found", szValue.GetBuffer(dwSize),dwSize,g_szLanguagePath); szValue.ReleaseBuffer(); szValue.Replace("\\n","\n"); //替换回换行符号 return szValue; } /********************************************************************* * 函数名称:g_SetDialogStrings(CDialog *pDlg,UINT uDlgID) * 说明: 当对话框运行时获取其所有可得到的字符串,并保存到语言文件中 每个控件用对话框ID和控件ID唯一标识 * 入口参数: * CDialog *pDlg -- 对话框的指针 * UINT uDlgID -- 该对话框的ID * 作者: Geng *********************************************************************/ void g_SetDialogStrings(CDialog *pDlg,UINT uDlgID) { CString szSection = "String"; CString szKey,szText; bool bSetText = 1; //1:从文件读,设置对话框 //0:从对话框读,保存到文件 if(bSetText) //1:从文件读,设置对话框 { CString szDefault = ""; DWORD dwSize = 1000; char* pData = (char*)malloc(dwSize); //读对话框标题 szKey.Format("IDD%d_Title",uDlgID); if(GetPrivateProfileString(szSection,szKey,szDefault, pData,dwSize,g_szLanguagePath) != 0) { pDlg->SetWindowText(pData); } //写入各个子控件的标题文字 CWnd* pWnd = pDlg->GetWindow(GW_CHILD); while(pWnd != NULL) { szKey.Format("IDD%d_%d",uDlgID,pWnd->GetDlgCtrlID()); if(GetPrivateProfileString(szSection,szKey,szDefault, pData,dwSize,g_szLanguagePath) != 0) { pWnd->SetWindowText(pData); } pWnd = pWnd->GetWindow(GW_HWNDNEXT); } //释放内存 free(pData); } else //0:从对话框读,保存到文件 { //写入对话框标题 szKey.Format("IDD%d_Title",uDlgID); pDlg->GetWindowText(szText); WritePrivateProfileString(szSection,szKey,szText,g_szLanguagePath); //写入各个子控件的标题文字 CWnd* pWnd = pDlg->GetWindow(GW_CHILD); while(pWnd != NULL) { szKey.Format("IDD%d_%d",uDlgID,pWnd->GetDlgCtrlID()); pWnd->GetWindowText(szText); WritePrivateProfileString(szSection,szKey,szText,g_szLanguagePath); pWnd = pWnd->GetWindow(GW_HWNDNEXT); } } } /********************************************************************* * 函数名称:CMultiLanguageApp::LoadLanguage * 说明: 装入或者设置语言 如果 szLangSel为空则装入语言,否则设置语言 * 作者: Geng *********************************************************************/ void CMultiLanguageApp::LoadLanguage(CString szLangSel /*= ""*/) { //查找语言 CString szSection = "Setting"; CString szKey = "Language",szLang; DWORD dwSize = 1000; if(!szLangSel.IsEmpty()) //保存语言 { szLang = szLangSel; } else //读取语言设置 { //获取设置的语言 GetPrivateProfileString(szSection,szKey,"English",szLang.GetBuffer(dwSize),dwSize,g_szSettingPath); szLang.ReleaseBuffer(); } //查找是否存在 CFileFind find; bool bRet = find.FindFile(g_szCurPath + "Language\\*.ini"); bool bFound = false; CString szEng = ""; while(bRet) { bRet = find.FindNextFile(); if(find.IsDots() || find.IsDirectory()) continue; CString szValue; CString szFilePath = find.GetFilePath(); if(GetPrivateProfileString(szSection,szKey,"",szValue.GetBuffer(dwSize), dwSize,szFilePath) != 0) { szValue.ReleaseBuffer(); if(szValue == szLang) { g_szLanguagePath = szFilePath; bFound = true; break; } } } find.Close(); //未找到设定的语言 if(!bFound) { int nLangID[2] = {IDR_LANG_ENG,IDR_LANG_CH}; CString szFileName[2] = {"\\Multi_eng.ini","\\Multi_ch.ini"}; CString szPath = g_szCurPath + "Language"; CreateDirectory(szPath,NULL); for(int i = 0;i < 2;i++) { MakeResource(nLangID[i],szPath + szFileName[i]); } //默认使用英文 g_szLanguagePath = szPath + szFileName[0]; szLang = "English"; } //保存语言设置 WritePrivateProfileString(szSection,szKey,szLang,g_szSettingPath); } /********************************************************************* * 函数名称:CMultiLanguageApp::MakeResource * 说明: 如果未找到所需的资源文件(如设置文件,语言文件等),从程序中产生 * 作者: Geng *********************************************************************/ bool CMultiLanguageApp::MakeResource(int nID, CString szPathName) { HRSRC hSrc = FindResource(NULL,MAKEINTRESOURCE(nID),_T("OWNER_DATA")); if(hSrc == NULL) return false; HGLOBAL hGlobal = LoadResource(NULL,hSrc); if(hGlobal == NULL) return false; LPVOID lp = LockResource(hGlobal); DWORD dwSize = SizeofResource(NULL,hSrc); CFile file; if(file.Open(szPathName,CFile::modeCreate|CFile::modeWrite)) { file.Write(lp,dwSize); file.Close(); } FreeResource(hGlobal); return true; }